package untiring07;

import java.util.Scanner;

public class J32_Exception {

	/**
	 * 예외처리 exception
	 * 오류처리는 프로그래밍 언어의 중요한 기능임
	 * 좋은 오류 처리 매커니즘은 프로그래머가 보다 쉽게 견고한 프로그램을 작성하고
	 * 몰래 섞여 들어오는 버그를 방지할 수 있음
	 * 
	 * 일부 언어에서는 발생가능한 모든 오류를 미리 감지하기 위해 강제로 다중if문을 사용
	 * 이런 경우 코드가 지나치게 복잡해짐
	 * 
	 * 자바에서는 try문을 사용하여 오류를 감지하고 처리
	 * 
	 * 오류error vs 예외exception
	 * 프로그램의 정상실행을 방해하는 요소
	 * 오류:프로그램의 잘못된 코드나 CPU연산의 잘못된 동작으로 발생
	 * 컴파일 오류, 실행시간 오류로 다시 분류
	 * 
	 * 컴파일 오류 :  잘못된 문법으로 인해 발생된 오류   예) int a = 111111111111111;
	 * 실행시간 오류 : 잘못된 코드사용이나                   예)100/0 문법적으로 문제없으나 실행시 이상
	 *			     하드웨어의 오동작으로 인한 오류    
	 * 하드웨어적으로 발생하는 오류를 제외하고 모든 오류는 개발자가 적절히 수정가능
	 * 
	 * 예외 : 일반적인 프로그램 실행 순서를 벗어나는 것
	 * 프로그램 상에서 코드에 의해 예외를 바로 잡을 수 있음
	 * 즉, 위에서 언급한 오류들을 코드에 의해 수습할 수 있는 미약한 오류라는 의미도 있음
	 * 
	 * 실행시간 오류가 생길것 같은 코드는 일반적으로 try-catch-finally 문으로 격리 가능
	 * 오류가 발생하면 try 블록의 처리를 중단하고 catch 블록으로 제어가 넘어감
	 * 
	 * 
	 * 
	 */
	public static void main(String[] args) {
		
		
		// 오류가 발생하는 경우  - 코드 무시
		System.out.println("이글이 보이나요?");
		//System.out.println(100/0);      // 무시
		System.out.println("이글도 보이나요?");
	
		// 오류가 발생하는 경우  - 코드 무시
		System.out.println("이글이 보이나요?");
		try{
		System.out.println(100/0);
		}catch(Exception e){
			//System.out.println("0으로 나눌수 없어요!");
			//e.printStackTrace();
			System.out.println(e.getMessage());
		}
		System.out.println("이글도 보이나요?");
		
		//1-10사이 정수를 받아 출력하는 프로그램
		Scanner sc = new Scanner(System.in);
		
		//while(true){
			System.out.println("1-10 사이 정수를 입력하세요");
			int num=0;
			try{
				sc = new Scanner(System.in); // 이전에 입력한 내용이 문자인 경우
				// Scanner 내부 저장소(버퍼)에 남아있기 때문에 계속 무한반복으로 위 문장 출력
				// Scanner 를 다시 초기화해야만 문제가 해결
				num = sc.nextInt();
				System.out.println("입력하신 정수는 "+num);//break;
			}catch(Exception e){
				System.err.println("장난 하지마! 숫자넣어");
			}
			
		//} //while
		
		
		//예외 처리1
		int[] name = new int[3];
		try{
		name [0] =1 ;
		name [1] =2 ;
		name [2] =3 ;
		name [3] =4 ;
		}catch (Exception ex){
			System.out.println("배열 크기 초과");
		}
		//예외 처리2
		int result = 0;
		try{
			for(int i = 10; i >= 0 ; --i){
				result += (int)(Math.random()*100)/i;
				System.out.println(result);
			}
		}catch(Exception e){
			System.err.println("오류발생");
		}
		System.out.println(result);
		
		//다중 예외 처리
		/*try{
			System.out.println(100/0);
			char[] grade = new char[3];
			grade[3]='a';
			}catch(Exception e){
				System.err.println("ㄷㄷ");*/
			
			
		try{
		//System.out.println(100/0);
		char[] grade = new char[3];
		grade[3]='a';
		
		}catch(ArithmeticException ae){//산술식 감지
			System.err.println("0으로 나누지 못함2");
		}catch(ArrayIndexOutOfBoundsException aiobe){//배열감지
			System.err.println("배열 범위 벗어남");
		}catch(Exception e){//상위 개념 감지(위에 2개를 포함하고있다)
			System.out.println("알수 없는 오류발생");
		}
		
		
		//코드에서 발생할 수 있는 예외가 하나 이상인 경우 다중 catch문으로
		//각각의 예외에 따라 독자적인 오류처리를 할 수 있음
		
		
	}//main

}//class
